#include <mips/regdef.h>

#define upper_limit t0

	.file	1 "generic/estimador_media.c"
	.section .mdebug.abi32
	.previous
	.abicalls
	.text
	.align	2
	.globl	estimador_media
	.ent	estimador_media
estimador_media:

	/// PROLOGO, se prepara el STACK
        /// STACK:
        /// -------------------------------------------------
	/// se salvan dos registros enteros (fp y gp, 8 bytes)
	/// no hay registros de punto flotante que salvar (0 bytes)
	/// area de opeacion, variables locales (4 bytes de padding + 4 bytes para variable temporal = 8 bytes)	
	/// no hay argumentos a proxima funcion (0 bytes)
	/// TOTAL: 16 bytes

	subu	sp, sp, 0x10

	sw	$fp, 0xc(sp)
	sw	gp, 8(sp)

	//padding	4(sp)
	//temporl	0(sp)
	
	move	$fp, sp

	/// fin del prologo

	/// carga de parametros en las variables locales
	mult	a1,a1			// n*n
	mflo	v0
	sll	v0, v0, 2		// aritmetica de punteros
	addu	upper_limit, a0, v0	// upper_limit = m + n*n

	sll	v0, a2, 2		// aritmetica de punteros
	addu	a0, a0, v0		// m += col

	sw	zero, 0($fp)
	l.s	$f0, 0($fp)		// total = 0

	sll	v0, a1, 2		// v0 = n*4

	/// bucle principal
$L2:
	l.s	$f2, 0(a0)	
	add.s	$f0, $f0, $f2	/// total += *m
	addu	a0, a0, v0	/// m1 += n

	blt	a0, upper_limit, $L2

	/// division por n
	sw	a1, 0($fp)
	l.s	$f2, 0($fp)
	cvt.s.w	$f2, $f2
	div.s	$f0, $f0, $f2
	
	// devolver el parametro al puntero

	s.s $f0, 0(a3)
	move v0, zero

	// EPILOGO, FINAL, se reestablece el estado
	move	sp, $fp

	lw	gp, 8(sp)
	lw	$fp, 0xc(sp)

	addu	sp, sp, 0x10
	
	j	ra
	.end	estimador_media
	.size	estimador_media, .-estimador_media
	.ident	"GCC: (GNU) 3.3.3 (NetBSD nb3 20040520)"
